/**
 * tab buttons
 * ibio-develop
 * 2009-12-1 12:13
 */
package com.ibio8.components.helpers {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	/**
	 * 标签切换按钮集合。
	 * 
	 * <p>
	 * 用来管理一系列按钮的状态，例如当前选中的按钮。此类所管理的按钮应都继承自 
	 * com.ibio8.components.buttons.MCRadioButton。此类有两种使用方法：
	 * </p>
	 * <ul>
	 * <li>1 直接 new TabButtons(onTabClickDoLater, this, 2, "mc_tab");</li>
	 * <li>2 静态调用 TabButtons.init(onTabClickDoLater, m_trackItems, 2, 0);</li>
	 * </ul>
	 * 
	 * @see com.ibio8.components.buttons.MCRadioButton	MCRadioButton
	 */
	public class TabButtons {
		/** @private **/
		protected static var m_allMenus:Object = new Object();
		/** @private **/
		protected var m_tabItems:Object;
		/** @private **/
		protected var m_totalTabs:uint;
		/** @private **/
		protected var m_tabPrefix:Object;
		/** @private **/
		protected var m_onClick:Function;
		
		/**
		 * 初始化 tab items
		 * @param	onClick		点击后的回调函数，此回调函数将包含一个参数 index(int)，
		 * 用来指明当前选中的按钮的索引（从 0 开始）。
		 * @param	tabItems	容纳所有 tabs 的容器，可以是 mc 或数组（MovieClip/Array）
		 * @param	totalTabs	总的 tab 数量
		 * @param	tabPrefix	前缀或者 key
		 * @usage
		 * tabPrefix 两个层次的用途
		 * ①当用 TabButtons.init 实例化多个 TabButtons 时，当作区分它们的 key（可以为 string 和 int）
		 * ②当 tabItems 为容器时，为获取单个 tab 的前缀
		 */
		public function TabButtons(onClick:Function, tabItems:Object, totalTabs:uint, tabPrefix:Object = null) {
			m_onClick = onClick;
			m_tabItems = tabItems;
			m_totalTabs = totalTabs;
			m_tabPrefix = tabPrefix;
			for (var i:uint = 0; i < m_totalTabs; i++) {
				/**
				 * 这里的这些 item 需要继承 com.ibio8.components.buttons.MCRadioButton
				 * 因为要显示当前的那些状态
				 */
				//dynamic property
				getCurrentTab(i).index = i;
				getCurrentTab(i).addEventListener(MouseEvent.CLICK, onTabClickHandler);
			}
		}
		
		/**
		 * 选中当前索引的 tab
		 * @param	index		需要选中的，若超出 range，则表示清空当前的选择
		 * @param	dispatch	是否需要回调函数
		 */
		public function onTabClick(index:int, dispatch:Boolean = false):void {
			for (var i:uint = 0; i < m_totalTabs; i++) {
				getCurrentTab(i).selected = (i == index);
			}
			//dispatch
			if (dispatch && (m_onClick != null)) {
				m_onClick(index);
			}
		}
		
		/**
		 * 移除所有的帧听和按钮操作
		 */
		public function remove():void {
			for (var i:uint = 0; i < m_totalTabs; i++) {
				//如果这些按钮有 remove 函数，则调用
				if (getCurrentTab(i).remove != null) {
					getCurrentTab(i).remove();
				}
				getCurrentTab(i).removeEventListener(MouseEvent.CLICK, onTabClickHandler);
			}
		}
		
		//-------------------- static method --------------------
		/**
		 * 初始化一组新的标签切换按钮集合
		 * @copy	com.ibio8.components.helpers.TabButtons
		 */
		public static function init(onClick:Function, tabItems:Object, totalTabs:uint, tabPrefix:Object):TabButtons {
			var newTabButtons:TabButtons = new TabButtons(onClick, tabItems, totalTabs, tabPrefix);
			//保存实例
			m_allMenus[tabPrefix] = newTabButtons;
			return newTabButtons;
		}
		
		/**
		 * 选中指定标签的当前索引的标签按钮
		 * @param	tabPrefix	指定的标签
		 * @copy	com.ibio8.components.helpers.onTabClick
		 */
		public static function onTabClickByPrefix(tabPrefix:Object, index:int, dispatch:Boolean = false):void {
			var instance:TabButtons = m_allMenus[tabPrefix];
			if (instance) {
				instance.onTabClick(index, dispatch);
			}
		}
		
		/**
		 * 清除指定标签所有的帧听和按钮操作
		 * @param	tabPrefix	指定的标签
		 * @copy	com.ibio8.components.helpers.remove
		 */
		public static function removeByPrefix(tabPrefix:Object):void {
			var instance:TabButtons = m_allMenus[tabPrefix];
			if (instance) {
				instance.remove();
				delete m_allMenus[tabPrefix];
			}
		}
		
		/** @private **/
		protected function onTabClickHandler(e:MouseEvent):void {
			onTabClick(e.currentTarget.index, true);
		}
		
		/** @private **/
		protected function getCurrentTab(index:uint):MovieClip {
			var tab:MovieClip;
			//如果 m_tabItems 是 Array，则表示此 tabs 是动态 new 出来的，
			//需要用数组下标来获取当前的 tab
			if (m_tabItems is Array) {
				tab = m_tabItems[index];
			}else {
				tab = m_tabItems[m_tabPrefix + index];
			}
			return tab;
		}
	}
}